/* ==================================================================   
 * Created [2009-4-27 下午11:32:55] by Jon.King 
 * ==================================================================  
 * TSS 
 * ================================================================== 
 * mailTo:jinpujun@hotmail.com
 * Copyright (c) Jon.King, 2009-2012 
 * ================================================================== 
 */

package com.jinhe.tss.component.support.web.upload;

import java.io.File;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;

import com.jinhe.tss.core.exception.BusinessException;

/**
 * <p> FileDownloadManager.java </p>
 * <p>
 * 文件上传管理对象
 * </p>
 */
public class FileUploadManager {
 
    /**
     * 上传文件检查器：可以过滤哪些文件能上传，哪些文件不能上传，
     * 实现接口com.jinhe.tss.component.support.web.upload.IFileUploadValidator。
     * 通常情况下可以使用后缀校验对象：com.jinhe.tss.component.support.web.upload.SuffixFileValidator
     * 不指定则不校验。
     */
    @Autowired private IFileUploadValidator validator; //文件检查对象
    
    /**
     * 文件上传后处理对象：一般为复制、移动、保存文件等，
     * 实现接口com.jinhe.tss.component.support.web.upload.IFileUploadProcessor。
     * 通常情况下可以使用文件复制处理对象：com.jinhe.tss.component.support.web.upload.FileCopyProcessor
     * 不指定则不做任何事情。
     */
    @Autowired private IFileUploadProcessor processor; 
    
    /**
     * 文件上传处理完成后扩展对象：一般为处理文件上传完成后对文件或相关数据的处理，组织返回信息
     * 实现接口com.jinhe.tss.component.support.web.upload.IFileUploadExtender
     * 不指定则默认返回“文件上传成功”
     */
    @Autowired private IFileUploadExtender  extender; 

    /**
     * <p>
     * 文件上传处理过程
     * </p>
     * @param file 需要上传的文件
     * @param params 上传文件相关参数
     * @return Object 返回前台的数据对象，必须覆盖toString方法为输出前台代码
     */
    public Object upload(File file, Map<String, String> params) {
        //文件合法性检测
        if (validator != null && !validator.validate(file, params)) {
            throw new BusinessException(validator.getErrorMessage());
        }
        
        //文件处理
        if(processor != null) {
            file = processor.execute(file, params);
        } 
        
        //文件后续操作
        if(extender != null) {
            return extender.excute(file, params);
        }
        return null;
    }
}
